package com.sojson.util.json.impl;

import java.io.IOException;
import java.util.List;
import java.util.Map;

import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.sojson.util.StringUtil;
import com.sojson.util.json.JsonUtilInterface;

/**
 * Json工具类实现类
 * 
 * @author liu
 * @date 2020-08-26
 */
public class FastJsonUtilImpl implements JsonUtilInterface {

    private static FastJsonUtilImpl fastJsonUtilImpl;

    private FastJsonUtilImpl() {}

    /**
     * 将对象转换成json字符串(值为空的不解析)
     * 
     * @param data 被转换的对象
     * @return 得到的字符串
     * @throws IOException
     */
    @Override
    public String objectToJson(Object data) {
        // SerializerFeature.DisableCircularReferenceDetect解决循环引用问题
        return JSONObject.toJSONString(data, SerializerFeature.DisableCircularReferenceDetect,
            SerializerFeature.WriteDateUseDateFormat);
    }

    /**
     * 将对象转换成json字符串(值为空的也解析)
     * 
     * @param data 被转换的对象
     * @return 得到的字符串
     * @throws IOException
     */
    @Override
    public String objectToJsonAll(Object data) {
        // SerializerFeature.DisableCircularReferenceDetect解决循环引用问题
        // SerializerFeature.WriteMapNullValue:如果不设置,某个字段为null的话就不显示,json对象就没有这个属性
        // SerializerFeature.WriteDateUseDateFormat修改日期格式
        return JSONObject.toJSONString(data, SerializerFeature.DisableCircularReferenceDetect,
            SerializerFeature.WriteMapNullValue, SerializerFeature.WriteDateUseDateFormat);
    }

    /**
     * 将json字符串转换成对象
     * 
     * @param jsonData json字符串
     * @param beanType 要转换成的对象的类型
     * @return 得到的对象
     * @throws IOException
     */
    @Override
    public <T> T jsonToObject(String jsonData, Class<T> beanType) {
        return JSONObject.parseObject(jsonData, beanType);
    }

    /**
     * 将json数据转换成指定类型的list
     * 
     * @param <T>
     * @param jsonData json字符串
     * @param beanType 要转换成的list的类型
     * @return 得到的list
     * @throws IOException
     */
    @Override
    public <T> List<T> jsonToList(String jsonData, Class<T> beanType) {
        return JSONObject.parseArray(jsonData, beanType);
    }

    /**
     * 将json数据转换成指定类型的map
     * 
     * @param <T> Map的Key
     * @param <K> Map的Value
     * @param jsonData json字符串
     * @param keyType 要转换成的map的key的类型
     * @param valueType 要转换成的map的value的类型
     * @return 得到的Map
     * @throws IOException
     */
    @Override
    @SuppressWarnings("unchecked")
    public <T, K> Map<T, K> jsonToMap(String jsonData, Class<T> keyType, Class<K> valueType) {
        return JSONObject.parseObject(jsonData, Map.class);
    }

    /**
     * 判断一个对象是否是空(空对象)
     * 
     * @param obj
     * @return
     */
    private static boolean isBlankObject(Object obj) {
        return StringUtil.isBlankObject(obj);
    }

    public static FastJsonUtilImpl getInstances() {
        if (isBlankObject(fastJsonUtilImpl)) {
            fastJsonUtilImpl = new FastJsonUtilImpl();
        }
        return fastJsonUtilImpl;
    }

}